
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型</title>
</head>

<body>
    <script>
        /**
         1.概念：  
         * 每一个函数都有一个prototype属性，指向另一个对象（就是原型对象）
         * prototype的所有属性和方法，都会被构造函数的实例继承。
         * prototype就是调用构造函数所创建的那个实例对象的原型。
         * 
         2.显示原型：prototype =>给程序员写代码用
         3.隐式原型：__proto__ =>给js程序查找原型关系使用的
         4.三者关系：
         *      MyClass.prototype.constructor = MyClass
                mc.__proto__ == MyClass.prototype
         * 
         5.原型作用：
            数据共享复用
        */

        function Factory() {
            this.name = "李四"
            this.fn1 = function () { }
            // this.fn2 = function () { }
        }
        // 将对象实例公共的方法或者是属性放到原型对象上
        Factory.prototype.fn2 = function () { console.log('我是fn2,在原型对象上') }
        // 1.原型对象（显示原型对象）
        console.log('显示原型', Factory.prototype)//{fn2}
        // 2.原型对象（隐式原型）
        var obj = new Factory()
        console.log('隐式原型', obj.__proto__)//{fn2}
        console.log("obj:", obj)//{name,fn1}
        var obj2 = new Factory()
        console.log('obj2:', obj2)//{name,fn1}
        // 3.显示原型==隐式原型
        console.log(Factory.prototype == obj.__proto__)//true
        obj2.fn2()

        // 4.显示原型 隐式原型 原型对象关系
        // Factory.prototype === >原型对象
        // obj.__proto__ === >原型对象
        // Factory.prototype == obj.__proto__
        // 原型对象 ===>constructor===>Factory

    </script>
</body>

</html>